package com.guomei.mapper.curse;

import com.guomei.bean.curse.CourseOrder;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 课程订单表数据访问接口
 */
@Mapper
public interface CourseOrderMapper {
    /**
     * 根据ID查询订单
     */
    CourseOrder selectById(Long id);

    /**
     * 根据订单编号查询订单
     */
    CourseOrder selectByOrderNo(String orderNo);

    /**
     * 根据用户ID查询订单列表
     */
    List<CourseOrder> selectByUserId(@Param("userId") Long userId, @Param("payStatus") Short payStatus);

    /**
     * 根据用户ID和课程ID查询已支付订单
     */
    CourseOrder selectByUserIdAndCourseId(@Param("userId") Long userId, @Param("courseId") Long courseId);

    /**
     * 根据课程ID查询订单列表
     */
    List<CourseOrder> selectByCourseId(Long courseId);

    /**
     * 查询所有订单
     */
    List<CourseOrder> selectAll();

    /**
     * 根据条件查询订单
     */
    List<CourseOrder> selectByCondition(CourseOrder courseOrder);

    /**
     * 根据条件查询订单（包含课程信息）
     */
    List<CourseOrder> selectByConditionWithCourse(CourseOrder courseOrder);

    /**
     * 根据条件查询订单（包含课程信息）
     */
    List<CourseOrder> selectByCondition1(CourseOrder courseOrder);

    /**
     * 根据用户ID查询订单列表（包含课程信息）
     */
    List<CourseOrder> selectByUserIdWithCourse(@Param("userId") Long userId, @Param("payStatus") Short payStatus);

    /**
     * 查询过期未支付的订单
     */
    List<CourseOrder> selectExpiredUnpaidOrders();

    /**
     * 新增订单
     */
    int insert(CourseOrder courseOrder);

    /**
     * 批量新增订单
     */
    int batchInsert(@Param("orders") List<CourseOrder> orders);

    /**
     * 根据ID更新订单
     */
    int updateById(CourseOrder courseOrder);

    /**
     * 根据订单编号更新订单状态
     */
    int updateStatusByOrderNo(@Param("orderNo") String orderNo, @Param("payStatus") Short payStatus,
                              @Param("payType") Short payType, @Param("payTime") LocalDateTime payTime);

    /**
     * 根据订单编号更新订单状态（包含订单状态）
     */
    int updateStatusByOrderNoWithOrderStatus(@Param("orderNo") String orderNo, @Param("payStatus") Short payStatus,
                              @Param("payType") Short payType, @Param("payTime") LocalDateTime payTime,
                              @Param("orderStatus") Short orderStatus);

    /**
     * 根据订单编号更新微信交易号
     */
    int updateWxNoByOrderNo(@Param("orderNo") String orderNo, @Param("wxNo") String wxNo);

    /**
     * 统计指定课程的总订单金额（仅已支付订单）
     */
    BigDecimal sumOrderAmountByCourseId(@Param("courseId") Long courseId);
    
    /**
     * 统计指定课程的总订单数量（仅已支付订单）
     */
    Long countOrdersByCourseId(@Param("courseId") Long courseId);

    /**
     * 根据订单编号更新微信支付状态（包含微信交易号）
     */
    int updateWechatPayStatus(@Param("orderNo") String orderNo, @Param("payStatus") Short payStatus,
                              @Param("payType") Short payType, @Param("payTime") LocalDateTime payTime,
                              @Param("transactionId") String transactionId);

    /**
     * 根据ID删除订单
     */
    int deleteById(Long id);

    /**
     * 批量删除订单
     */
    int batchDelete(@Param("ids") List<Long> ids);

    List<CourseOrder> selectByCourseList(CourseOrder order);

    int count();

    int notPayCount();
}
